// copyright jyz.2024


#include "AbilitySystem/ModMagCalc/MMC_MaxMana.h"

#include "AbilitySystem/AuraAttributeSet.h"
#include "Interaction/CombatInterface.h"

UMMC_MaxMana::UMMC_MaxMana()
{
	//捕获游戏属性
	IntelligenceDef.AttributeToCapture = UAuraAttributeSet::GetIntelligenceAttribute();
	//表示这个捕获定义的属性来源是目标对象。
	IntelligenceDef.AttributeSource = EGameplayEffectAttributeCaptureSource::Target;
	
	// IntelligenceDef.bSnapshot是一个布尔变量，决定了属性捕捉的行为方式。
	// 如果bSnapshot被设置为true，IntelligenceDef作为快照（snapshot）保存下来。即使后续这个属性的值有所改变，这个快照的值也不会变化。
	// 如果bSnapshot被设置为false，IntelligenceDef将不会在游戏效果被应用时立即记录属性值，而是在每次需要引用属性值时，都会获取目标对象"	智力"属性的当前值。
	// 这意味着如果在游戏效果持续期间，这个属性值发生变化，这些变化将会被反映在游戏效果中。
	// 因此，IntelligenceDef.bSnapshot = false; 这行代码是设置 IntelligenceDef 的行为，让它在每次引用"智力"属性时总是获取其最新的值，而不是在游戏效果被应用时的初始值。
	IntelligenceDef.bSnapshot = false;
	
	RelevantAttributesToCapture.Add(IntelligenceDef);
}

float UMMC_MaxMana::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const
{
	//从source 和 target 收集 Tags
	const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();
	const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();
	FAggregatorEvaluateParameters EvaluateParameters;
	EvaluateParameters.SourceTags = SourceTags;
	EvaluateParameters.TargetTags = TargetTags;
	//IntelligenceValue：智力值
	float IntelligenceValue = 0.f;
	GetCapturedAttributeMagnitude(IntelligenceDef,Spec,EvaluateParameters,IntelligenceValue);
	IntelligenceValue = FMath::Max(IntelligenceValue,0.f);
	if(ICombatInterface*CombatInterface = Cast<ICombatInterface>(Spec.GetContext().GetSourceObject()))
	{
		const int32 PlayerLevel = CombatInterface->GetCharacterLevel();
		return 100.f + 2.5f * IntelligenceValue + 20.f * PlayerLevel;
	}
	return 100.f + 2.5f * IntelligenceValue;
}
